﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace MakeIT.MiraPark.Negocios
{
    public class UsuarioBO
    {

        private miraparkEntities modelo = null;

        public UsuarioBO()
        {
            modelo = MiraParkModel.miraParkModel;
        }

        /// <summary>
        /// Salva um novo registro ou atualiza um já existente 
        /// </summary>
        /// <param name="entidade"></param>
        /// <param name="novo"></param>
        public void SalvaUsuario(usuario entidade, Boolean novo)
        {
            try
            {

                //Verifica se é um registro novo
                if (novo)
                {
                    //Adiciona um novo registro
                    modelo.AddTousuario(entidade);
                }
                else
                { 
                    //Efetiva as mudanças na entidade já existente
                    modelo.ApplyPropertyChanges(entidade.EntityKey.EntitySetName, entidade);
                }

                //Efetiva as mudancas já existentes
                modelo.SaveChanges();

            }
            catch (Exception ex)
            {

                throw ex;
            }
        }


        /// <summary>
        /// Recupera uma Lista de Usuarios através do IdUsuario ou nome
        /// </summary>
        /// <param name="IdUsuario"></param>
        /// <param name="nome"></param>
        /// <returns></returns>
        public List<usuario> RecuperaUsuario(int? idUsuario, string user, String nome, bool? ativo)
        {
            // declara objetos
            IQueryable<usuario> query = modelo.usuario;

            try
            {

                // Verifica se o código do Usuario é diferente de nulo
                if (idUsuario != null)
                {
                    // monta query dinamica
                    query = query.Where(a => a.IdUsuario == idUsuario);
                }

                // Verifica se filtro de nome do Usuario é diferente de vazio ou nulo
                if (!string.IsNullOrEmpty(user))
                {
                    // monta query dinamica
                    query = query.Where(a => a.Usuario.Equals(user));
                }

                // Verifica se filtro de nome do Usuario é diferente de vazio ou nulo
                if (!string.IsNullOrEmpty(nome))
                {
                    // monta query dinamica
                    query = query.Where(a => a.Nome.Contains(nome));
                }

                if (ativo != null)
                {
                    query = query.Where(a => (bool)a.Ativo == ativo);
                }
                
                query.OrderBy(a => a.Usuario);

                var retornaLista = from usuario in query
                                   select usuario;

                if (retornaLista.Count() > 0)
                {
                    return retornaLista.ToList();

                }
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        /// <summary>
        /// Recupera todos os registros de banco
        /// </summary>
        /// <returns></returns>
        public List<usuario> RecuperaUsuario()
        {
            return this.RecuperaUsuario(null, null, null, null);
        }

    
        /// <summary>
        /// Recupera Usuario através do idUsuario
        /// </summary>
        /// <param name="idUsuario"></param>
        /// <returns></returns>
        public usuario RecuperaUsuario(int idUsuario)
        {
            // declara objetos
            List<usuario> listaUsuario = null;

            try
            {
                listaUsuario = this.RecuperaUsuario(idUsuario, null, null, null);

                if (listaUsuario != null)
                {
                    return listaUsuario[0];
                }
                else
                {
                    return null;
                }

            }
            catch (Exception ex)
            {
                
                throw ex;
            }
        }

        /// <summary>
        /// Recupera Usuario através do nome
        /// </summary>
        /// <param name="nome"></param>
        /// <returns></returns>
        public usuario RecuperaUsuario(String nome)
        {
            // declara objetos
            List<usuario> listaUsuario = null;

            try
            {
                listaUsuario = this.RecuperaUsuario(null, null, nome, null);

                if (listaUsuario != null)
                {
                    return listaUsuario[0];
                }
                else
                {
                    return null;
                }

            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        /// <summary>
        /// Recupera Usuario através do nome
        /// </summary>
        /// <param name="nome"></param>
        /// <returns></returns>
        public usuario RecuperaUsuario(String user, bool ativo)
        {
            // declara objetos
            List<usuario> listaUsuario = null;

            try
            {
                listaUsuario = this.RecuperaUsuario(null, user, null, ativo);

                if (listaUsuario != null)
                {
                    return listaUsuario[0];
                }
                else
                {
                    return null;
                }

            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        /// <summary>
        /// Excluir um determinado registro 
        /// </summary>
        /// <param name="entidade">Registro a ser excluido</param>
        /// <param name="msg"></param>
        /// <returns>Retorna uma msg quando há, a qual sinaliza algum fluxo alternativo</returns>
        public void DeletaUsuario(usuario entidade)
        {
            try
            {
                EntityKey key = new EntityKey(modelo.DefaultContainerName + ".usuario", "IdUsuario", entidade.IdUsuario);
                modelo.DeleteObject(modelo.GetObjectByKey(key));
                modelo.SaveChanges();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


       
    }
}
